/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * AsignarFuncionario.java
 *
 * Created on 16/11/2011, 10:58:24 AM
 */
package presentacion;

import accesoDatos.GestorAdministrativo;
import accesoDatos.GestorAsignacion;
import accesoDatos.GestorMaquina;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import logicaNegocio.Administrativo;
import logicaNegocio.ClaseAsignacion;
import logicaNegocio.Maquina;
import presentacion.recursos.Contador;


/**
 *
 * @author Criiss
 */
public class AsignarFuncionario extends javax.swing.JFrame {

    ArrayList<Contador> listaHilos;
    Control control;
    int fila;
    int comp;
    private GestorAdministrativo gestorAdministrativo;
    private GestorAsignacion gestorAsignacion;
    private GestorMaquina gestorMaquina;
    private String id;
    private Administrativo adm;
    private boolean existeA;
    
    Date fechaActual = new Date();//esta clase es para manejar la fecha del sistema
    SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy"); //esta nos permite definir el formato de la fecha
    String cadenaFecha = formato.format(fechaActual);//Aqui asignamos la fecha del sistema en el String cadenaFecha
    Calendar calendario = Calendar.getInstance();//Ya esta clase sirve para obtener la hora
    
    /** Creates new form AsignarFuncionario */
    public AsignarFuncionario() {
        initComponents();
        setLocationRelativeTo(null);
        this.mensajesAyuda();
        this.gestorAdministrativo = new GestorAdministrativo();
        this.id = "";
        this.adm = null;
        this.existeA = false;
    }

    /**
     * 
     * @param fila
     * @param numeComp
     * @param c
     */
    
    public void getGestores(GestorAsignacion asi, GestorMaquina maq){
        this.gestorAsignacion = asi;
        this.gestorMaquina = maq;
    }
    
    public void getControl(int fila, String numeComp, Control c){
        this.control = c;
        this.comp = Integer.parseInt(numeComp);
        this.fila = fila;
        this.listaHilos = this.control.getListaHilos();
        this.txt_NumeroMaquina.setText(numeComp+"");
        this.txt_NumeroMaquina.setEditable(false);
    }
    
    private String calcularHoraFinal(String hora){
        char v1 = hora.charAt(0);
        char v2 = hora.charAt(1);
        char v3 = hora.charAt(3);
        char v4 = hora.charAt(4);
        int val = Integer.parseInt(v2+"");
        val = val+3;
        return v1+""+val+""+":"+v3+""+v4;
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    
    private void mensajesAyuda(){
        this.txt_CedulaFuncionario.setToolTipText("Escriba el numero de cedula con el formato: \"X-XXXX-XXXX\", incluyendo los ceros \"0\"");
        this.txt_FechaFuncionario.setToolTipText("Escriba la fecha del día de hoy bajo el formato: \"XX/XX/XX\"");
        this.txt_HoraFuncionario.setToolTipText("Escriba la hora de asignacion, con el formato de 24 horas de la siguiente forma: \"XX:XX\"");
    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lb_CedulaFuncionario = new javax.swing.JLabel();
        txt_CedulaFuncionario = new javax.swing.JTextField();
        btn_BuscarFuncionario = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JSeparator();
        lb_NombreFuncionario = new javax.swing.JLabel();
        lb_FacultadFuncionario = new javax.swing.JLabel();
        lb_NumeroMaquina = new javax.swing.JLabel();
        lb_InformacionFuncionario = new javax.swing.JLabel();
        txt_NombreFuncionario = new javax.swing.JTextField();
        txt_FacultadFuncionario = new javax.swing.JTextField();
        txt_NumeroMaquina = new javax.swing.JTextField();
        lb_FechaFuncionario = new javax.swing.JLabel();
        lb_HoraFuncionario = new javax.swing.JLabel();
        txt_FechaFuncionario = new javax.swing.JTextField();
        txt_HoraFuncionario = new javax.swing.JTextField();
        btn_AignarFuncionario = new javax.swing.JButton();
        btn_CancelarFuncionario = new javax.swing.JButton();

        setTitle("Asignacion de Funcionario");

        lb_CedulaFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        lb_CedulaFuncionario.setText("Cédula:");

        btn_BuscarFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        btn_BuscarFuncionario.setIcon(new javax.swing.ImageIcon(getClass().getResource("/presentacion/imagenes/Buscar.png"))); // NOI18N
        btn_BuscarFuncionario.setText("Buscar");
        btn_BuscarFuncionario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_BuscarFuncionarioActionPerformed(evt);
            }
        });

        lb_NombreFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        lb_NombreFuncionario.setText("Nombre Completo:");

        lb_FacultadFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        lb_FacultadFuncionario.setText("Departamento:");

        lb_NumeroMaquina.setFont(new java.awt.Font("Tahoma", 1, 11));
        lb_NumeroMaquina.setText("Numero Maquina:");

        lb_InformacionFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        lb_InformacionFuncionario.setText("Informacion de Funcionario:");

        txt_NombreFuncionario.setEditable(false);

        txt_FacultadFuncionario.setEditable(false);

        txt_NumeroMaquina.setEditable(false);

        lb_FechaFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        lb_FechaFuncionario.setText("Fecha:");

        lb_HoraFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        lb_HoraFuncionario.setText("Hora Inicio:");

        txt_FechaFuncionario.setEditable(false);

        txt_HoraFuncionario.setEditable(false);

        btn_AignarFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        btn_AignarFuncionario.setIcon(new javax.swing.ImageIcon(getClass().getResource("/presentacion/imagenes/Aceptar.png"))); // NOI18N
        btn_AignarFuncionario.setText("Asignar");
        btn_AignarFuncionario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_AignarFuncionarioActionPerformed(evt);
            }
        });

        btn_CancelarFuncionario.setFont(new java.awt.Font("Tahoma", 1, 11));
        btn_CancelarFuncionario.setIcon(new javax.swing.ImageIcon(getClass().getResource("/presentacion/imagenes/Cancelar.png"))); // NOI18N
        btn_CancelarFuncionario.setText("Cancelar");
        btn_CancelarFuncionario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_CancelarFuncionarioActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 419, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addGap(74, 74, 74)
                .addComponent(lb_CedulaFuncionario)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(btn_BuscarFuncionario))
                    .addComponent(txt_CedulaFuncionario, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(153, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(txt_FacultadFuncionario, javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(lb_InformacionFuncionario, javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(lb_NombreFuncionario, javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(txt_NombreFuncionario, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 355, Short.MAX_VALUE)
                        .addComponent(lb_FacultadFuncionario, javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(btn_CancelarFuncionario)
                            .addGap(29, 29, 29)
                            .addComponent(btn_AignarFuncionario)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lb_NumeroMaquina)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txt_NumeroMaquina, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(54, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lb_HoraFuncionario)
                .addContainerGap(345, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(txt_HoraFuncionario, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(txt_FechaFuncionario, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 144, Short.MAX_VALUE))
                .addContainerGap(265, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lb_FechaFuncionario)
                .addContainerGap(373, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lb_CedulaFuncionario)
                    .addComponent(txt_CedulaFuncionario, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btn_BuscarFuncionario)
                .addGap(11, 11, 11)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(lb_InformacionFuncionario)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(lb_NombreFuncionario)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txt_NombreFuncionario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(lb_FacultadFuncionario)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txt_FacultadFuncionario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txt_NumeroMaquina, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lb_NumeroMaquina))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(lb_FechaFuncionario)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txt_FechaFuncionario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(lb_HoraFuncionario)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txt_HoraFuncionario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btn_CancelarFuncionario)
                    .addComponent(btn_AignarFuncionario))
                .addContainerGap(54, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

      private boolean validarCedulaFuncionario(){
        String ced = this.txt_CedulaFuncionario.getText();
        Pattern p = Pattern.compile("^[1-7]\\-\\d{4}\\-\\d{4}");
        Matcher m = p.matcher(ced);
        if(m.find()){
            return true;
        }
        else{
                 return false;
        }
    }
    
    private boolean validarFuncionario(Administrativo adm){
        if(adm == null)
            return false;
        return true;
    }
      
    private void llenarVariablesIdentificacion(){
        this.id = this.txt_CedulaFuncionario.getText();
    }
      
    private void BuscarDatos(){
        this.llenarVariablesIdentificacion();
        this.adm = this.gestorAdministrativo.consultarDato(id);
        if(this.validarFuncionario(adm)){
            this.id = this.adm.getIdentificacion();
            this.existeA = true;
            this.txt_NombreFuncionario.setText(adm.getNombre());
            this.txt_FacultadFuncionario.setText(adm.getDepartamento());
        }else{
            this.buscarDatosRegistro();
        }
        this.llenarFecha();
    }
        
    private void btn_BuscarFuncionarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_BuscarFuncionarioActionPerformed
        this.BuscarDatos();
    }//GEN-LAST:event_btn_BuscarFuncionarioActionPerformed

    private void buscarDatosRegistro(){
        this.adm = this.gestorAdministrativo.consultarDatoRegistro(id);
        if(this.validarFuncionario(adm)){
            this.id = this.adm.getIdentificacion();
            this.existeA = false;
            this.txt_NombreFuncionario.setText(adm.getNombre());
            this.txt_FacultadFuncionario.setEditable(true);
        }
        else{
            JOptionPane.showMessageDialog(rootPane, "ERROR: El Funcionario No existe en la Base de Datos");
            this.setVisible(false);
        }
    }
    
    private void llenarFecha(){
        String hora = calendario.get(Calendar.HOUR_OF_DAY)+"";//Aqui le asignamos al int hora, la hora del sistema(formato de 24 horas)
        String minutos = calendario.get(Calendar.MINUTE)+"";//Aqui le asignamos al int minutos, los minutos del sistema
        if(hora.length() == 1)
            hora = "0"+hora;
        if(minutos.length() == 1)
            minutos = "0"+minutos;
        this.txt_HoraFuncionario.setText(hora+":"+minutos);
        this.txt_FechaFuncionario.setText(cadenaFecha);
    }
    
    private boolean validarNombreFuncionario(){
        if(!this.txt_NombreFuncionario.getText().equals("")){     
             return true;
        }
        else{
           return false;
        }
    }
    
    private boolean validarFacultadFuncionario(){
        if(!this.txt_FacultadFuncionario.getText().equals("")){
                return true;
            }
           else{
                 return false;
        }
    }
    
    private boolean validarFechaFuncionario(){
        String fecha = this.txt_FechaFuncionario.getText();
        if(!this.txt_FechaFuncionario.getText().equals("")){
          Pattern f = Pattern.compile("\\d{2}\\/\\d{2}\\/\\d{2}");
          Matcher ch = f.matcher(fecha);
          if(ch.find()){
            return true;
          }
          else{
            return false;
          }
        }
         else{
                 return false;
        }
    }
    
    private boolean validarHoraFuncionario(){
        String hor = this.txt_HoraFuncionario.getText();
        if(!this.txt_HoraFuncionario.getText().equals("")){
          Pattern h = Pattern.compile("\\d{2}\\:\\d{2}");
          Matcher r = h.matcher(hor);
          if(r.find()){
            return true;
          }
          else{
            return false;
          }
        }
           else{
                 return false;
        }
    }
    
    private void asignarAdministrativo(){
        if(validarNombreFuncionario() == true){
                if(validarFacultadFuncionario() == true){
                        if(validarFechaFuncionario() == true){
                            if(validarHoraFuncionario() == true){
                                //JOptionPane.showMessageDialog(rootPane, ("Todos los datos se ingresaron correctamente"));
                                String horaF = this.calcularHoraFinal(this.txt_HoraFuncionario.getText());
                                this.control.asignarComputadora(fila, this.txt_CedulaFuncionario.getText(),
                                        this.txt_HoraFuncionario.getText(), horaF);
                                Maquina maq = this.gestorMaquina.consultarDato(this.txt_NumeroMaquina.getText());
                                if(maq == null){
                                    maq = new Maquina(Integer.parseInt(this.txt_NumeroMaquina.getText()), 1);
                                    this.gestorMaquina.ingresarDato(maq);
                                }
                                else{
                                    maq.setEstado(1);
                                    this.gestorMaquina.modificarDato(maq);
                                }
                                if(!this.existeA)
                                    this.gestorAdministrativo.ingresarDato(adm);
                                this.gestorAsignacion.ingresarDato(
                                        new ClaseAsignacion(adm.getIdentificacion(), maq.getNumeroMaquina(),
                                                this.txt_FechaFuncionario.getText(),
                                                this.txt_HoraFuncionario.getText(),
                                                horaF)
                                        );
                                this.txt_NombreFuncionario.setText("");
                                this.txt_FacultadFuncionario.setText("");
                                this.txt_FechaFuncionario.setText("");
                                this.txt_HoraFuncionario.setText("");
                                this.control.cargarTabla();
                                Contador contador = new Contador(fila, control);
                                this.listaHilos.add(contador);
                                contador.getHilo().start();
                                this.control.setListaHilos(this.listaHilos);
                                this.dispose();
                            }
                            else{
                               JOptionPane.showMessageDialog(rootPane, ("Hora Incorrecta")); 
                            }
                        }
                        else { 
                            JOptionPane.showMessageDialog(rootPane, ("Fecha Incorrecta"));
                        }
                    }
                    
                else{
                    JOptionPane.showMessageDialog(rootPane, ("Facultad Incorrecta"));
                }
            }
        else{
            JOptionPane.showMessageDialog(rootPane, ("Nombre Incorrecto"));
        }
    }
    
    private void btn_AignarFuncionarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_AignarFuncionarioActionPerformed
         this.asignarAdministrativo();
    }//GEN-LAST:event_btn_AignarFuncionarioActionPerformed

private void btn_CancelarFuncionarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_CancelarFuncionarioActionPerformed
    setVisible(false);
}//GEN-LAST:event_btn_CancelarFuncionarioActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btn_AignarFuncionario;
    private javax.swing.JButton btn_BuscarFuncionario;
    private javax.swing.JButton btn_CancelarFuncionario;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JLabel lb_CedulaFuncionario;
    private javax.swing.JLabel lb_FacultadFuncionario;
    private javax.swing.JLabel lb_FechaFuncionario;
    private javax.swing.JLabel lb_HoraFuncionario;
    private javax.swing.JLabel lb_InformacionFuncionario;
    private javax.swing.JLabel lb_NombreFuncionario;
    private javax.swing.JLabel lb_NumeroMaquina;
    private javax.swing.JTextField txt_CedulaFuncionario;
    private javax.swing.JTextField txt_FacultadFuncionario;
    private javax.swing.JTextField txt_FechaFuncionario;
    private javax.swing.JTextField txt_HoraFuncionario;
    private javax.swing.JTextField txt_NombreFuncionario;
    private javax.swing.JTextField txt_NumeroMaquina;
    // End of variables declaration//GEN-END:variables
}
